UserProg

OS에서 바이너리 파일 실행하는 과정을 pintos를 기준으로 알아보자

ELF binary

ELF(Executable and Linkable Format)는 주로 유닉스 및 유닉스 계열 운영체제, 예를 들어 리눅스에서 사용하는 파일 형식이다. ELF 형식은 바이너리 파일, 실행 파일, 공유 라이브러리, 핵심 덤프 등 다양한 유형의 파일을 위한 범용 표준이다. 다양한 프로세서 아키텍처와 운영체제에서 사용될 수 있도록 유연성을 제공한다.

주요 구성 요소

  1. 헤더: 파일의 시작 부분에 위치하며, 파일의 종류(실행 가능 파일, 공유 라이브러리, 오브젝트 파일 등), 아키텍처(32비트 또는 64비트), 엔트리 포인트(프로그램 실행 시작 위치) 등의 중요 정보를 담고 있다.
  2. 프로그램 헤더 테이블: 실행 파일을 메모리에 어떻게 로드할지에 대한 세그먼트 정보를 제공한다. 예를 들어, 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트 등의 위치와 크기 정보가 포함된다.
  3. 섹션 헤더 테이블: 파일 내 각 섹션의 정보를 제공한다. 섹션은 코드, 데이터, 심볼 테이블, 재배치 정보 등 다양한 데이터를 포함할 수 있다.
  4. 심볼 테이블: 프로그램의 함수와 변수 등 심볼에 대한 정보를 담고 있다. 링커나 로더가 이 정보를 사용하여 심볼의 주소를 결정하고 참조를 해결한다.
  5. 재배치 테이블: 코드나 데이터가 메모리의 어디에 위치해야 할지를 동적으로 결정할 수 있도록 돕는 정보다. 예를 들어, 공유 라이브러리를 사용할 때 필요한 정보를 제공한다.

종류

  • 실행 파일: 사용자가 직접 실행할 수 있는 프로그램 파일이다.
  • 오브젝트 파일: 컴파일러가 소스 코드를 컴파일하여 생성한 중간 파일로, 다른 오브젝트 파일이나 라이브러리와 링크될 수 있다.
  • 공유 라이브러리: 다양한 프로그램에서 공통으로 사용되는 코드 및 데이터를 포함하여, 여러 프로그램에서 재사용될 수 있다.
  • 코어 덤프: 프로그램이 비정상적으로 종료됐을 때, 그 시점의 메모리 상태를 저장한 파일로, 디버깅에 사용된다.

pintos상에서 실행되는 ELF는 실행파일이라고 가정하고 load시에 해당 정보를 읽어와 확인을 진행한다.

Run